home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
ms_dos
/
e
/
e.c
next >
Wrap
Text File
|
1993-11-30
|
7KB
|
301 lines
/*======================================
* LCON用 EXPファイル実行ドライバ
*
* 1993 by マシーンM
*======================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <process.h>
#include <dos.h>
#include <sys\stat.h>
#define VERSION "0.04"
#define ENV_EXP "PATHEXP" // EXPファイル格納位置 環境変数
#define EXT_EXP "exp" // EXPファイルの拡張子
int flag_initt = 0; // 実行後テキスト画面 0:初期化しない 1:初期化する
int flag_initg = 0; // 実行後グラフィック画面 0:初期化しない 1:初期化する
int flag_nocrt = 0; // nocrtresetフラグ 0:付けない 1:付ける
int flag_exec = 1; // 実行フラグ 0:実行しない 1:実行する
int flag_text = 1; // テキスト表示フラグ 0:表示しない 1:表示する
void
call_int91(int ax)
{
union REGS inregs, outregs;
inregs.x.ax = ax;
int86(0x91, &inregs, &outregs);
}
/*----------------------------------------------------
* ファイルが存在するかの確認
*----------------------------------------------------
* in name - ファイル名
* out <ret> - 1:存在する
* 0:存在しない
*----------------------------------------------------
*/
int
is_exist(char *name)
{
struct stat buf;
return stat(name, &buf) ? 0 : 1;
}
/*----------------------------------------------------
* 環境変数に設定されているパスを順番に取り出す
* (初期化)
*----------------------------------------------------
* in env - 取り出す環境変数名
*----------------------------------------------------
*/
char path_buf[256];
char *path_ptr;
void
init_path(char *env)
{
char *p;
p = getenv(env);
if ( p == (char*)0 ) {
path_buf[0] = 0;
} else {
strcpy(path_buf, p);
}
path_ptr = strtok(path_buf, ";");
}
/*----------------------------------------------------
* 環境変数に設定されているパスを順番に取り出す
* パスの最後は必ず "\" になっている
*----------------------------------------------------
* out <ret> - !0:パス名
* 0:おわり
*----------------------------------------------------
*/
char *
get_path(void)
{
static char buf[256];
int c;
if ( path_ptr == 0 ) return 0;
strcpy(buf, path_ptr);
c = strlen(buf);
if ( c > 0 && buf[c-1]!='\\' && buf[c-1]!=':' ) {
strcat(buf, "\\");
}
path_ptr = strtok(NULL, ";");
return buf;
}
/*-------------------------------------------------
* 指定ファイル名の拡張子を再設定する
*-------------------------------------------------
* in name - ファイル名
* ext - 拡張子(ピリオドはいらない)
* 例. "EXP"
*-------------------------------------------------
*/
void
extcat(char *name, char *ext)
{
char *pp, *nmp;
if ( (nmp=strrchr(name, '\\'))==NULL ) { // ファイル名の位置設定
nmp = name;
}
if ( (pp=strrchr(nmp, '.'))!=NULL ) { // ファイル名の"."以降を削除
*pp = 0;
}
strcat(name, ".");
strcat(name, ext);
}
/*-------------------------------------------
* ファイルを検索し、フルパスを返す
*-------------------------------------------
*/
char *
search_exp(char *name)
{
static char buf[256];
char *path;
if ( strchr(name, '\\')!=NULL || strchr(name, ':')!=NULL ) {
strcpy(buf, name);
extcat(buf, EXT_EXP);
if ( is_exist(buf) ) return buf;
} else {
init_path(ENV_EXP);
while ( (path=get_path()) != 0 ) {
strcpy(buf, path);
strcat(buf, name);
extcat(buf, EXT_EXP);
if ( is_exist(buf) ) return buf;
}
}
return (char*)0;
}
int
option_check(int argc, char *argv[])
{
int j;
if ( argc < 2 ) return 1;
if ( argv[1][0] != '-' ) return 0;
for (j=1; argv[1][j]!=0; ++j) {
switch ( toupper(argv[1][j]) ) {
case 'G': flag_initg = 1; break;
case 'I': flag_initt = 1; break;
case 'N': flag_nocrt = 1; break;
case 'P': flag_exec = 0; break;
case 'S': flag_text = 0; break;
default : return 1;
}
}
return 0;
}
/*-------------------------------------------
* ファイル名を取得する
*-------------------------------------------
*/
char *
get_name(int argc, char *argv[])
{
static char buf[256];
int n;
n = (argv[1][0]=='-') ? 2 : 1;
if ( n >= argc ) return (char *)0;
strcpy(buf, argv[n]);
return buf;
}
/*-------------------------------------------
* ファイル名以降の文字を取得する
*-------------------------------------------
*/
char *
get_arg(int argc, char *argv[])
{
static char buf[256];
int n, i;
n = (argv[1][0]=='-') ? 3 : 2;
buf[0] = 0;
for (i=n; i<argc; ++i) {
strcat(buf, " ");
strcat(buf, argv[i]);
}
return buf;
}
char *usage_strings[]={
"===== EXPファイル実行ドライバ(LCON専用) version "VERSION" =====" ,
" Copyright (c) 1993 マシーンM" ,
" Usage: e [-{<option>}] <EXPファイル名> [{<引数>}]" ,
" <option>: g - 実行後、グラフィック画面を消去する" ,
" i - 実行後、テキスト画面を初期化する" ,
" n - 「-nocrt」 を付ける" ,
" p - 実行コマンド文字列を表示する(実行はしない)" ,
" s - 実行時、テキスト表示を禁止する" ,
0
};
void
show_strings(char *strings[])
{
int i;
for (i=0; strings[i]!=0; ++i) {
puts(strings[i]);
}
}
void
print_usage(void)
{
show_strings(usage_strings);
exit(1);
}
int
main(int argc, char *argv[])
{
char *name;
char *pathname;
char *arg;
static char buf[256];
int ret = 0;
if ( option_check(argc, argv) == 1 ) print_usage();
name = get_name(argc, argv);
arg = get_arg(argc, argv);
if ( name ) {
strcpy(buf, "run386 ");
if ( flag_nocrt ) strcat(buf, "-nocrt ");
pathname = search_exp(name);
if ( pathname ) {
strcat(buf, pathname);
if ( arg ) strcat(buf, arg);
if ( flag_exec ) {
if ( !flag_text ) {
call_int91(0x3004); // TEXT OFF
outportb(0xfda0, 0x0f); // レイア1 ON
}
call_int91(0x3001); // 現在の TEXT VRAM を退避
call_int91(0x3010); // TEXT VRAM1 を選択
ret = system(buf) ? 1 : 0;
call_int91(0x3002); // 以前の TEXT VRAM を復帰
} else {
puts(buf);
}
} else {
strcpy(buf, "not found : ");
strcat(buf, name);
puts(buf);
ret = 1;
}
}
if ( flag_initt ) {
call_int91(0x3080); // コンソール初期化
call_int91(0x3003); // 文字描画開始
}
if ( flag_initg ) {
putchar('\x15'); // グラフィック消去
}
return ret;
}